///////////////////////////////////////////////////////////////////////////////
// File:        SqlField.hpp
// Author:      671643387@qq.com
// Description: 
///////////////////////////////////////////////////////////////////////////////

#if !defined(SHARED_DATABASE_SQLFIELD_HPP_)
#define SHARED_DATABASE_SQLFIELD_HPP_

#if defined(_MSC_VER) && (_MSC_VER >= 1200)
# pragma once
#endif

#include <cstdint>
#include <string>

///////////////////////////////////////////////////////////////////////////////
class SqlField
{
public:
    ///////////////////////////////////////////////////////////////////////////
    enum DataTypes
    {
        DB_TYPE_UNKNOWN     = 0x00,
        DB_TYPE_STRING      = 0x01,
        DB_TYPE_INTEGER     = 0x02,
        DB_TYPE_FLOAT       = 0x03,
        DB_TYPE_BOOL        = 0x04
    };
public:
    ///////////////////////////////////////////////////////////////////////////////
    SqlField(void);
    SqlField(const char* value, enum DataTypes type);
    ~SqlField(void);

public:
    ///////////////////////////////////////////////////////////////////////////////
    void SetType(enum DataTypes type) { type_ = type; }
    enum DataTypes GetType(void) const { return type_; }
    void SetValue(const char* value) { value_ = value; }

    ///////////////////////////////////////////////////////////////////////////////
    bool IsNull(void) const { return value_ == NULL; }
    const char* GetCString(void) const { return value_; }
    std::string GetString(void) const { return std::string(((value_ != NULL) ? value_ : "")); }
    float GetFloat() const { return value_ ? static_cast<float>(atof(value_)) : 0.0f; }
    bool GetBool() const { return value_ ? atoi(value_) > 0 : false; }
    double GetDouble() const { return value_ ? static_cast<double>(atof(value_)) : 0.0f; }
    int8_t GetInt8() const { return value_ ? static_cast<int8_t>(atol(value_)) : int8_t(0); }
    int32_t GetInt32() const { return value_ ? static_cast<int32_t>(atol(value_)) : int32_t(0); }
    uint8_t GetUInt8() const { return value_ ? static_cast<uint8_t>(atol(value_)) : uint8_t(0); }
    uint16_t GetUInt16() const { return value_ ? static_cast<uint16_t>(atol(value_)) : uint16_t(0); }
    int16_t GetInt16() const { return value_ ? static_cast<int16_t>(atol(value_)) : int16_t(0); }
    uint32_t GetUInt32() const { return value_ ? static_cast<uint32_t>(atol(value_)) : uint32_t(0); }
    uint64_t GetUInt64() const;
    int64_t GetInt64() const;

private:
    ///////////////////////////////////////////////////////////////////////////
    const char*     value_;
    enum DataTypes  type_;
};

#endif //SHARED_DATABASE_SQLFIELD_HPP_
